home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / tutorials / geometer / print.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  11.2 KB  |  406 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17.  
  18. #include <stdio.h>
  19. #include <strings.h>
  20. #include "parse.h"
  21. #include <sys/types.h>
  22. #include <sys/stat.h>
  23.  
  24. extern primitive *plist;
  25.  
  26. static FILE *fpout;
  27.  
  28. void printstate(primitive *p, reservedword ptype)
  29. {
  30.     if (p->Color != 7) {
  31.     switch (p->Color) {
  32.         case -3:
  33.             fprintf(fpout, ", .blink");
  34.         break;
  35.         case -2:
  36.             fprintf(fpout, ", .smear");
  37.         break;
  38.             case -1:
  39.             fprintf(fpout, ", .invisible");
  40.         break;
  41.         case 0:
  42.             fprintf(fpout, ", .black");
  43.         break;
  44.         case 1:
  45.             fprintf(fpout, ", .red");
  46.         break;
  47.         case 2:
  48.             fprintf(fpout, ", .green");
  49.         break;
  50.         case 3:
  51.             fprintf(fpout, ", .yellow");
  52.         break;
  53.         case 4:
  54.             fprintf(fpout, ", .blue");
  55.         break;
  56.         case 5:
  57.             fprintf(fpout, ", .magenta");
  58.         break;
  59.         case 6:
  60.             fprintf(fpout, ", .cyan");
  61.         break;
  62.         default:
  63.             fprintf(fpout, ", .c%d", p->Color);
  64.         break;
  65.     }
  66.     }
  67.     if (p->layers != 0xffffffff) {
  68.     for (long i = 0; i < 16; i++) {
  69.         if ((p->layers)&(1<<i))
  70.             fprintf(fpout, ", .L%d", i);
  71.     }
  72.     }
  73.     if (ptype == _vertex && ((vertex *)p)->type != _diamond) {
  74.     switch (((vertex *)p)->type) {
  75.         case _plus:
  76.             fprintf(fpout, ", .plus");
  77.         break;
  78.         case _cross:
  79.             fprintf(fpout, ", .cross");
  80.         break;
  81.         case _nomark:
  82.             fprintf(fpout, ", .nomark");
  83.         break;
  84.         case _soliddiamond:
  85.             fprintf(fpout, ", .soliddiamond");
  86.         break;
  87.     }
  88.     }
  89.     if (ptype == _line && ((line *)p)->type != _segment) {
  90.     switch (((line *)p)->type) {
  91.         case _longline:
  92.             fprintf(fpout, ", .longline");
  93.         break;
  94.         case _ray12:
  95.             fprintf(fpout, ", .ray12");
  96.         break;
  97.     }
  98.     }
  99.     if (p->name[0]) {
  100.     fprintf(fpout, ", \"%s\"", p->name);
  101.     }
  102.     fprintf(fpout, ");\n");
  103. }
  104.  
  105. void printvertex(vertex *v)
  106. {
  107.     switch (v->c.type) {
  108.     case VERTFREE:
  109.         fprintf(fpout, "%s = .free(%g, %g", v->st->symbol,
  110.             v->xw, v->yw);
  111.             break;
  112.     case VERTONLINE:
  113.         fprintf(fpout, "%s = .vonl(%s, %g, %g", v->st->symbol,
  114.             v->c.p1->st->symbol, v->xw, v->yw);
  115.             break;
  116.     case VERTONCIRCLE:
  117.         fprintf(fpout, "%s = .vonc(%s, %g, %g", v->st->symbol,
  118.             v->c.p1->st->symbol, v->xw, v->yw);
  119.             break;
  120.     case VERTLINELINE:
  121.         fprintf(fpout, "%s = .v.ll(%s, %s", v->st->symbol,
  122.             v->c.p1->st->symbol, v->c.p2->st->symbol);
  123.             break;
  124.     case VERTVERTVERTMID:
  125.         fprintf(fpout, "%s = .v.vvmid(%s, %s", v->st->symbol,
  126.             v->c.p1->st->symbol, v->c.p2->st->symbol);
  127.             break;
  128.     case VERTLINECIRC1:
  129.         fprintf(fpout, "%s = .v.lc(%s, %s, 1", v->st->symbol,
  130.             v->c.p1->st->symbol, v->c.p2->st->symbol);
  131.             break;
  132.     case VERTLINECIRC2:
  133.         fprintf(fpout, "%s = .v.lc(%s, %s, 2", v->st->symbol,
  134.             v->c.p1->st->symbol, v->c.p2->st->symbol);
  135.             break;
  136.     case VERTCIRCCIRC1:
  137.         fprintf(fpout, "%s = .v.cc(%s, %s, 1", v->st->symbol,
  138.             v->c.p1->st->symbol, v->c.p2->st->symbol);
  139.             break;
  140.     case VERTCIRCCIRC2:
  141.         fprintf(fpout, "%s = .v.cc(%s, %s, 2", v->st->symbol,
  142.             v->c.p1->st->symbol, v->c.p2->st->symbol);
  143.             break;
  144.     case VERTVERTVERTRATIO:
  145.         fprintf(fpout, "%s = .v.vvratio(%s, %s, %s", v->st->symbol,
  146.             v->c.p1->st->symbol, v->c.p2->st->symbol, 
  147.         v->c.p3->st->symbol);
  148.             break;
  149.     case VERTANGLEVERTVERT:
  150.         fprintf(fpout, "%s = .v.avv(%s, %s, %s", v->st->symbol,
  151.             v->c.p1->st->symbol, v->c.p2->st->symbol, 
  152.         v->c.p3->st->symbol);
  153.             break;
  154.     case VERTCIRCCENTER:
  155.         fprintf(fpout, "%s = .v.ccenter(%s", v->st->symbol, 
  156.             v->c.p1->st->symbol);
  157.             break;
  158.     case VERTLINEVERTMIRROR:
  159.         fprintf(fpout, "%s = .v.lvmirror(%s, %s", v->st->symbol, 
  160.             v->c.p1->st->symbol, v->c.p2->st->symbol);
  161.             break;
  162.     case VERTONCONIC:
  163.         fprintf(fpout, "%s = .vonconic(%s, %g, %g", v->st->symbol,
  164.             v->c.p1->st->symbol, v->xw, v->yw);
  165.             break;
  166.     case VERTCIRCVERTINV:
  167.         fprintf(fpout, "%s = .v.vcinv(%s, %s", v->st->symbol,
  168.             v->c.p1->st->symbol, v->c.p2->st->symbol);
  169.             break;
  170.     case VERTLINECONIC1:
  171.         fprintf(fpout, "%s = .v.lconic(%s, %s, 1", v->st->symbol,
  172.             v->c.p1->st->symbol, v->c.p2->st->symbol);
  173.             break;
  174.     case VERTLINECONIC2:
  175.         fprintf(fpout, "%s = .v.lconic(%s, %s, 2", v->st->symbol,
  176.             v->c.p1->st->symbol, v->c.p2->st->symbol);
  177.             break;
  178.     }
  179.     printstate(v, _vertex);
  180. }
  181.  
  182. void printline(line *l)
  183. {
  184.     switch (l->c.type) {
  185.     case LINEVERTVERT:
  186.         fprintf(fpout, "%s = .l.vv(%s, %s", l->st->symbol,
  187.             l->c.p1->st->symbol, l->c.p2->st->symbol);
  188.             break;
  189.     case LINEVERTLINEPAR:
  190.         fprintf(fpout, "%s = .l.vlpar(%s, %s", l->st->symbol,
  191.             l->c.p1->st->symbol, l->c.p2->st->symbol);
  192.             break;
  193.     case LINEVERTLINEPERP:
  194.         fprintf(fpout, "%s = .l.vlperp(%s, %s", l->st->symbol,
  195.             l->c.p1->st->symbol, l->c.p2->st->symbol);
  196.             break;
  197.     case LINEVERTCIRC1:
  198.         fprintf(fpout, "%s = .l.vc(%s, %s, 1", l->st->symbol,
  199.             l->c.p1->st->symbol, l->c.p2->st->symbol);
  200.             break;
  201.     case LINEVERTCIRC2:
  202.         fprintf(fpout, "%s = .l.vc(%s, %s, 2", l->st->symbol,
  203.             l->c.p1->st->symbol, l->c.p2->st->symbol);
  204.             break;
  205.     case LINECIRCCIRCEXT1:
  206.         fprintf(fpout, "%s = .l.ccext(%s, %s, 1", l->st->symbol,
  207.             l->c.p1->st->symbol, l->c.p2->st->symbol);
  208.             break;
  209.     case LINECIRCCIRCEXT2:
  210.         fprintf(fpout, "%s = .l.ccext(%s, %s, 2", l->st->symbol,
  211.             l->c.p1->st->symbol, l->c.p2->st->symbol);
  212.             break;
  213.     case LINECIRCCIRCINT1:
  214.         fprintf(fpout, "%s = .l.ccint(%s, %s, 1", l->st->symbol,
  215.             l->c.p1->st->symbol, l->c.p2->st->symbol);
  216.             break;
  217.     case LINECIRCCIRCINT2:
  218.         fprintf(fpout, "%s = .l.ccint(%s, %s, 2", l->st->symbol,
  219.             l->c.p1->st->symbol, l->c.p2->st->symbol);
  220.             break;
  221.     case LINETANGENTCONIC1:
  222.         fprintf(fpout, "%s = .l.conicv(%s, %s, 1", l->st->symbol,
  223.             l->c.p1->st->symbol, l->c.p2->st->symbol);
  224.             break;
  225.     case LINETANGENTCONIC2:
  226.         fprintf(fpout, "%s = .l.conicv(%s, %s, 2", l->st->symbol,
  227.             l->c.p1->st->symbol, l->c.p2->st->symbol);
  228.             break;
  229.     }
  230.     printstate(l, _line);
  231. }
  232.  
  233. void printcircle(circle *c)
  234. {
  235.     switch (c->c.type) {
  236.     case CIRCVERTVERT:
  237.         fprintf(fpout, "%s = .c.vv(%s, %s", c->st->symbol,
  238.             c->c.p1->st->symbol, c->c.p2->st->symbol);
  239.             break;
  240.     case CIRCCIRCCIRCINV:
  241.         fprintf(fpout, "%s = .c.ccinv(%s, %s", c->st->symbol,
  242.             c->c.p1->st->symbol, c->c.p2->st->symbol);
  243.             break;
  244.     case CIRCLINECIRCINV:
  245.         fprintf(fpout, "%s = .c.lcinv(%s, %s", c->st->symbol,
  246.             c->c.p1->st->symbol, c->c.p2->st->symbol);
  247.             break;
  248.     case CIRCVERTVERTVERT:
  249.         fprintf(fpout, "%s = .c.vvv(%s, %s, %s", c->st->symbol,
  250.             c->c.p1->st->symbol, c->c.p2->st->symbol, c->c.p3->st->symbol);
  251.             break;
  252.     case CIRCLINELINELINE1:
  253.         fprintf(fpout, "%s = .c.lll(%s, %s, %s, 1", c->st->symbol,
  254.             c->c.p1->st->symbol, c->c.p2->st->symbol, c->c.p3->st->symbol);
  255.             break;
  256.     case CIRCLINELINELINE2:
  257.         fprintf(fpout, "%s = .c.lll(%s, %s, %s, 2", c->st->symbol,
  258.             c->c.p1->st->symbol, c->c.p2->st->symbol, c->c.p3->st->symbol);
  259.             break;
  260.     case CIRCLINELINELINE3:
  261.         fprintf(fpout, "%s = .c.lll(%s, %s, %s, 3", c->st->symbol,
  262.             c->c.p1->st->symbol, c->c.p2->st->symbol, c->c.p3->st->symbol);
  263.             break;
  264.     case CIRCLINELINELINE4:
  265.         fprintf(fpout, "%s = .c.lll(%s, %s, %s, 4", c->st->symbol,
  266.             c->c.p1->st->symbol, c->c.p2->st->symbol, c->c.p3->st->symbol);
  267.             break;
  268.     case CIRCVERTLEN:
  269.         fprintf(fpout, "%s = .c.vlen(%s, %s", c->st->symbol,
  270.             c->c.p1->st->symbol, c->c.p2->st->symbol);
  271.             break;
  272.     }
  273.     printstate(c, _circle);
  274. }
  275.  
  276. void printbezier(bezier *c)
  277. {
  278.     switch (c->c.type) {
  279.     case BEZVERTVERTVERTVERT:
  280.         fprintf(fpout, "%s = .bez.vvvv(%s, %s, %s, %s", c->st->symbol,
  281.             c->c.p1->st->symbol, c->c.p2->st->symbol, 
  282.         c->c.p3->st->symbol, c->c.p4->st->symbol);
  283.             break;
  284.     }
  285.     printstate(c, _bezier);
  286. }
  287.  
  288. void printtext(text *c)
  289. {
  290.     fprintf(fpout, ".text(\"%s\"", c->str);
  291.     printstate(c, _text);
  292. }
  293.  
  294. void printlength(length *c)
  295. {
  296.     switch (c->c.type) {
  297.     case LENVERTVERT:
  298.         fprintf(fpout, "%s = .len.vv(%s, %s", c->st->symbol,
  299.             c->c.p1->st->symbol, c->c.p2->st->symbol);
  300.         break;
  301.     case LENPLUSLENLEN:
  302.         fprintf(fpout, "%s = .len.plus(%s, %s", c->st->symbol,
  303.             c->c.p1->st->symbol, c->c.p2->st->symbol);
  304.         break;
  305.     case LENMINUSLENLEN:
  306.         fprintf(fpout, "%s = .len.minus(%s, %s", c->st->symbol,
  307.             c->c.p1->st->symbol, c->c.p2->st->symbol);
  308.         break;
  309.     case LENTIMESLENLEN:
  310.         fprintf(fpout, "%s = .len.times(%s, %s", c->st->symbol,
  311.             c->c.p1->st->symbol, c->c.p2->st->symbol);
  312.         break;
  313.     case LENDIVLENLEN:
  314.         fprintf(fpout, "%s = .len.divide(%s, %s", c->st->symbol,
  315.             c->c.p1->st->symbol, c->c.p2->st->symbol);
  316.         break;
  317.     case LENFLOAT:
  318.         fprintf(fpout, "%s = .len.f(%g", c->st->symbol,
  319.             c->value);
  320.         break;
  321.     case LENANGLE:
  322.         fprintf(fpout, "%s = .len.a(%s", c->st->symbol, c->st->symbol);
  323.         break;
  324.     case ANGLEVERTVERTVERT:
  325.         fprintf(fpout, "%s = .a.vvv(%s, %s, %s", c->st->symbol,
  326.             c->c.p1->st->symbol, c->c.p2->st->symbol, 
  327.         c->c.p3->st->symbol);
  328.         break;
  329.     case RATIOVERTVERTVERT:
  330.         fprintf(fpout, "%s = .ratio.vvv(%s, %s, %s", c->st->symbol,
  331.             c->c.p1->st->symbol, c->c.p2->st->symbol, 
  332.         c->c.p3->st->symbol);
  333.             break;
  334.     }
  335.     printstate(c, _length);
  336. }
  337.  
  338. void printconic(conic *c)
  339. {
  340.     switch (c->c.type) {
  341.     case CONICFIVEVERT:
  342.         fprintf(fpout, "%s = .conic.vvvvv(%s, %s, %s, %s, %s", c->st->symbol,
  343.             c->c.p1->st->symbol, c->c.p2->st->symbol, 
  344.         c->c.p3->st->symbol, c->c.p4->st->symbol,
  345.         c->c.p5->st->symbol);
  346.             break;
  347.     case CONICFIVELINE:
  348.         fprintf(fpout, "%s = .conic.lllll(%s, %s, %s, %s, %s", c->st->symbol,
  349.             c->c.p1->st->symbol, c->c.p2->st->symbol, 
  350.         c->c.p3->st->symbol, c->c.p4->st->symbol,
  351.         c->c.p5->st->symbol);
  352.             break;
  353.     }
  354.     printstate(c, _conic);
  355. }
  356. void printcomment(comment *c)
  357. {
  358.     fprintf(fpout, "//%s", c->str);
  359. }
  360.  
  361. void printprim(primitive *p)
  362. {
  363.     switch (p->ptype) {
  364.     case _vertex:
  365.         printvertex((vertex *)p);
  366.         break;
  367.     case _line:
  368.         printline((line *)p);
  369.         break;
  370.     case _circle:
  371.         printcircle((circle *)p);
  372.         break;
  373.     case _bezier:
  374.         printbezier((bezier *)p);
  375.         break;
  376.     case _length:
  377.         printlength((length *)p);
  378.         break;
  379.     case _comment:
  380.         printcomment((comment *)p);
  381.         break;
  382.     case _conic:
  383.         printconic((conic *)p);
  384.         break;
  385.     case _text:
  386.         printtext((text *)p);
  387.         break;
  388.     }
  389. }
  390.  
  391. long printall(char *s)
  392. {
  393.     mode_t omask = umask(0);
  394.     fpout = fopen(s, "w");
  395.     umask(omask);
  396.     if (fpout == 0) {
  397.     fprintf(stderr, "can't open %s\n", s);
  398.     return 0;
  399.     }
  400.     fprintf(fpout, ".geometry \"version 0.1\";\n");
  401.     for (primitive *p = plist; p; p = p->next)
  402.         printprim(p);
  403.     fclose(fpout);
  404.     return 1;
  405. }
  406.